import lodash from 'lodash';
import {
    convertSecToMinAndSec,
    createAGroupFolder,
    getCurrentDate,
    getGroupPlayerList,
    getPlayerData,
    isGroupExist,
    isPlayerExist,
    readConfiguration,
    storagePlayerData,
    timestampToSeconds
} from '../function/function.js';

export class Bs extends plugin {
    constructor() {
        super({
            name: '[Bs]送面包',
            dsc: '送面包',
            event: 'message',
            priority: 1,
            rule: [
                { reg: /^[#\/]送.*/, fnc: 'give' }
            ]
        })
    }

    async give(e) {
        // 非群无法游玩
        if (!e.isGroup) return e.reply(['该游戏只能在群内使用'])
        // 判断是否@机器人
        if (e.atme) return e.reply(['不能赠送给机器人哦~'])
        /** ID [群, 用户, 指定用户] */
        const ID = [e.group_id, e.user_id, e.at]
        // 判断执行条件 [用户与指定用户为同一人]
        if (ID[1] === ID[2]) return e.reply(['无法送自己哦~'])
        /** 用户输入内容 */
        const USER_INPUT_CONTENT = e.msg.replace(/#|\/|送/g, '')
        /** 配置数据 */
        const configData = await readConfiguration()
        /** 默认物品 */
        let defaultItem = configData['bread_thing']
        /** 自定义物品 */
        const CUSTOM_ITEMS = configData['special_thing_group'][ID[0]]

        // 判断执行条件 [不存在指定用户 同时 送面包操作必须指定用户]
        if (!ID[2] && !configData['is_random_given']) return e.reply(['您还没有@要送的玩家呢'])
        // 判断执行条件 [不存在自定义物品 同时 用户输入内容不为默认物品] 或者 [存在自定义物品 同时 用户输入内容不为自定义物品]
        if (!CUSTOM_ITEMS && USER_INPUT_CONTENT !== defaultItem || CUSTOM_ITEMS && USER_INPUT_CONTENT !== CUSTOM_ITEMS) return false
        // 存在自定义物品 默认物品修改为自定义物品
        if (CUSTOM_ITEMS) {
            defaultItem = CUSTOM_ITEMS
        }

        // 判断是否有此群文件夹，没有则创建
        if (!isGroupExist(ID[0])) { createAGroupFolder(ID[0]) }

        // 判断是否存在该用户，没有则创建基础信息
        if (!isPlayerExist(ID[0], ID[1])) {
            storagePlayerData(ID[0], ID[1], {
                name: e.sender.card || '未设置面包昵称',
                lv: 0,
                xp: 0,
                number: 0,
                cd: { buy: 0, eat: 0, rob: 0, give: 0, bet: 0 },
                log: { buy: [], eat: [], rob: [], give: [], bet: [] }
            })
        }

        /** 用户数据 */
        const USER_DATA = await getPlayerData(ID[0], ID[1])
        /** 用户面包数量 */
        const USER_NUMBER = USER_DATA['number']
        /** 当前秒 */
        const CURRENT_SECOND = timestampToSeconds(Date.now())
        /** 剩余CD */
        const REMAINING_TIME = CURRENT_SECOND - USER_DATA['cd']['give']

        // 若剩余CD为负数，则CD还未结束，返回提示
        if (REMAINING_TIME < 0) {
            const { minutes, remainingSeconds } = convertSecToMinAndSec(Math.abs(REMAINING_TIME))
            if (minutes > 0) {
                return e.reply([`无法送${defaultItem}，还有${minutes}分${remainingSeconds}秒`])
            } else {
                return e.reply([`无法送${defaultItem}，还有${remainingSeconds}秒`])
            }
        }

        /** 送的面包数量 */
        let giveNumber = lodash.random(configData['min_give'], configData['max_give'])
        let giveNumber2 = giveNumber

        // 判断用户面包是否够送
        if (USER_NUMBER < giveNumber) {
            return e.reply([`你的${defaultItem}还不够送，来买一些吧`])
        }

        /** 被送玩家数据 */
        let giveUserData;

        // 判断是否指定玩家
        if (ID[2]) {
            // 判断是否存在该玩家
            if (!isPlayerExist(ID[0], ID[2])) return e.reply([`该玩家没有${defaultItem}数据呢~`])

            /** 该玩家数据 */
            const USER_2_DATA = await getPlayerData(ID[0], ID[2])

            // 写入
            giveUserData = USER_2_DATA
        } else { // 不指定玩家随机送
            /** 该群的玩家列表 */
            let GROUP_USER_LIST = getGroupPlayerList(ID[0])

            // 从可送玩家列表中删除自己
            GROUP_USER_LIST = GROUP_USER_LIST.filter(item => item !== `${ID[1]}.json`)

            if (GROUP_USER_LIST.length === 0) return e.reply([`该群只要你玩了${defaultItem}商店，快叫他们买${defaultItem}吧~`])

            /** 从可送玩家列表随机一个玩家 */
            let randomUser = lodash.random(0, GROUP_USER_LIST.length - 1)
            const USER_ID = GROUP_USER_LIST[randomUser].replace(/.json/g, '')
            /** 该玩家数据 */
            const USER_2_DATA = await getPlayerData(ID[0], USER_ID)

            // 写入
            giveUserData = USER_2_DATA
            ID[2] = USER_ID
        }

        /** 返回消息 */
        let msg = `成功赠送了${giveNumber}个${defaultItem}给[${giveUserData['name']}]，你现在拥有${USER_NUMBER - giveNumber}个${defaultItem}！`

        /** 1~0 之间的随机数 */
        const RANDOM_NUMBER = Math.random();
        /** 随机事件 */
        if (RANDOM_NUMBER < 0.06) {
            giveNumber2 = lodash.random(configData['min_give'], Math.min(configData['max_give'], USER_NUMBER))
            msg = `大好人！我帮你送吧！送了${giveNumber}个给[${giveUserData['name']}]，我再送你${giveNumber2}个！`
            giveNumber2 = -giveNumber2
        } else if (RANDOM_NUMBER < 0.1) {
            /** [1, 2] 之间的随机数 */
            const RANDOM = lodash.random(1, 2)
            if (RANDOM === 1) {
                if (USER_NUMBER > configData['max_give'] * 2) {
                    msg = `哇！这么多${defaultItem}，你送了${giveNumber}个给[${giveUserData['name']}]！\r再给我${giveNumber}个吧嘿嘿！你现在有${USER_NUMBER - giveNumber * 2}个${defaultItem}！`
                    giveNumber2 *= 2
                }
            } else {
                msg = `看在你如此善良的份上，我帮你送吧！送了${giveNumber}个给[${giveUserData['name']}]，你不损失${defaultItem}！`
                giveNumber2 = 0
            }
        }

        // 用户数据处理 & 存储
        USER_DATA['cd']['give'] = CURRENT_SECOND + configData['cd_give']
        USER_DATA['log']['give'].push(`[${getCurrentDate()}] 送了[${giveUserData['name']}]${giveNumber}个${defaultItem}`)
        USER_DATA['number'] -= giveNumber2
        storagePlayerData(ID[0], ID[1], USER_DATA)
        // 被送用户数据处理 & 存储
        giveUserData['number'] += giveNumber
        storagePlayerData(ID[0], ID[2], giveUserData)

        // 返回送面包结果
        return e.reply([msg])
    }
}